home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / kbdtest.asm < prev    next >
Assembly Source File  |  1985-06-03  |  13KB  |  506 lines

  1. TITLE  KBDTEST.ASM    Keyboard check out program for the Chameleon keyboard
  2.         PAGE  ,132
  3.  
  4. ;----------------------------------------------------------------------
  5. ;
  6. ;    KBDTEST is designed to check out the Chameleon keyboard.
  7. ;               No exit to DOS is provided.
  8. ;
  9. ;               by: Michael Searles   Jan. 1984         
  10. ;
  11. ;----------------------------------------------------------------------
  12.  
  13.         SUBTTL ROM bios interupt equates
  14.         PAGE
  15. keybdIO        equ    16H        ;interupt for key board IO
  16.  key_in        equ    0
  17.  key_status    equ    1
  18.  shift_status    equ    2
  19.  
  20. videoIO        equ    10H
  21.  set_cur_type    equ    1
  22.  pos_cursor    equ    2
  23.  read_cur_pos    equ    3
  24.  select_page    equ    5
  25.  scroll_up    equ    6
  26.  scroll_down    equ    7
  27.  chr_att_in    equ    8
  28.  chr_att_out    equ    9
  29.  chrs_out    equ    10
  30.  chr_out    equ    14
  31.  read_status    equ    15
  32.  
  33. cr        equ    0DH
  34. lf        equ    0AH
  35. eos        equ    04H
  36.  
  37.  
  38. stack        SEGMENT STACK
  39.         org 100H
  40. top_of_stack    LABEL WORD
  41. stack        ENDS
  42.  
  43.         SUBTTL data segment
  44.         PAGE
  45. data        SEGMENT PUBLIC 'data'
  46.  
  47.  
  48. att_length    DW    ?        ;contains the char count for set_attribute
  49. current_mode    DB    ?        ;current crt mode
  50. current_page    DB    ?        ;current video display page
  51. cursor_start    DB    ?        ;cursor start data
  52. end_of_scroll    DW    ?
  53. key_loc        DW    ?        ;temporarily holds screen position
  54. key_loc2    DW    ?        ;for bottom of blocks
  55. line_buffer    DB    80 DUP (?)    ;input buffer for Getstring
  56. scroll_count    DB    ?
  57. shift_stat_reg    DB    ?        ;holds shift status byte
  58. start_of_scroll    DW    ?
  59. STRING_PTR    DW    ?        ;addr of the start of convert buffer
  60.         DB    10 DUP(?)    ;buffer for convert to decimal string
  61. string_base    DB    ' ',eos        ;end of convert buffer
  62. video_attribute DB    brite        ;attribute to use on screen
  63.  normal        equ    00000111B    ;normal video attribute
  64.  brite        equ    00001111B    ;high intensity
  65.  inversnormal    equ    01110000B    ;invers normal letters
  66.  inversbrite    equ    01111000B    ;invers fat letters
  67.  blinking    equ    10000111B    ;blinking letters
  68. ;==================================DATA TABLES=================================
  69.  
  70. ;In keytable ---> LOW byte = character code
  71. ;                HIGH byte = scan code
  72.  
  73. ;               F1   F2    ESC    1     !     2     @     3     #     4     $     5     %     6
  74. keytable    DW    3B00H,3C00H,011BH,0231H,0221H,0332H,0340H,0433H,0423H,0534H,0524H,0635H,0625H,0736H
  75.  
  76. ;                         ^     7     &     8     *     9     (     0     )     -     _     =     +  
  77.         DW    075EH,0837H,0826H,0938H,092AH,0A39H,0A28H,0B30H,0B29H,0C5FH,0C2DH,0D3DH,0D2BH
  78.  
  79.  
  80. ;                         BS    NL    SL   F3    F4    -->   <--    Q     q     W     w     E     e     R     r
  81.         DW    0E08H,4500H,4600H,3D00H,3E00H,0F09H,0F00H,1051H,1071H,1157H,1177H,1245H,1265H,1352H,1372H
  82.  
  83. ;                         T     t     Y     y     U     u     I     i     O     o     P     p     
  84.         DW    1454H,1474H,1559H,1579H,1655H,1675H,1749H,1769H,184FH,186FH,1950H,1970H
  85.  
  86.  
  87. ;              [     {     ]     }    RET   HOM    7     UP    8    PGU    9     -    F5    F6    CTL    A     a  
  88.         DW    1A5BH,1A7BH,1B7DH,1B5DH,1C0DH,4700H,4737H,4800H,4838H,4900H,4939H,4A2DH,3F00H,4000H,1D00H,1E41H,1E61H
  89.  
  90. ;                         S     s     D     d     F     f     G     g     H     h     J     j     K     k 
  91.         DW    1F53H,1F73H,2044H,2064H,2146H,2166H,2247H,2267H,2348H,2368H,244AH,246AH,254BH,256BH
  92.  
  93.  
  94. ;              L     l     :     ;     "     '     ~     `    <--    4     5    -->    6    F7    F8    sft
  95.         DW    264CH,266CH,273AH,273BH,2822H,2827H,297EH,2960H,4B00H,4B34H,4C35H,4D00H,4D36H,4100H,4200H,3600H
  96.  
  97. ;              |     \     Z     z     X     x     C     c     V     v     B     b     N     n       
  98.         DW    2B7CH,2B5CH,2C5AH,2C7AH,2D58H,2D78H,2E43H,2E63H,2F56H,2F76H,3042H,3062H,314EH,316EH
  99.     
  100.  
  101.  
  102. ;              M     m     <     ,     >     .     ?     /    sft    *    END    1    DN     2   PgDn    3     +    F9
  103.         DW    324DH,326DH,333CH,332CH,343EH,342EH,353FH,352FH,3600H,372AH,4F00H,4F31H,5000H,5032H,5100H,5133H,4E2BH,4300H
  104.  
  105. ;                        F10   ALT   SPA   CL    INS    0     .    DEL      
  106.         DW    4400H,38FFH,3920H,3A00H,5200H,8030H,532EH,5300H
  107.  
  108. keytable_length equ     $-keytable
  109.  
  110.  
  111.  
  112. ;key_location --> high byte = screen row
  113. ;                 low byte  = screen column   
  114.                                 
  115. key_location    DW       0600H,0602H,0604H,0608H,0608H,060AH,060AH,060CH,060CH  ;
  116.         DW    060EH,060EH,0610H,0610H,0612H,0612H,0614H,0614H,0616H  ;TOP ROW
  117.         DW    0616H,0618H,0618H,061AH,061AH,061CH,061CH,061EH,061EH  ;
  118.                 DW    0620H,0622H,0624H                               ;    
  119.  
  120.         DW    0900H,0902H,0904H,0904H,0907H,0907H,0909H,0909H,090BH  ;
  121.         DW    090BH,090DH,090DH,090FH,090FH,0911H,0911H,0913H,0913H  ; Q ROW
  122.         DW    0915H,0915H,0917H,0917H,0919H,0919H,091BH,091BH,091DH  ; 
  123.         DW    091DH,091FH,0922H,0922H,0924H,0924H,0926H,0926H,0927H  ;
  124.  
  125.         DW    0C00H,0C02H,0C0EH,0C08H,0C08H,0C0AH,0C0AH,0C0CH,0C0CH  ; 
  126.         DW    0C0EH,0C0EH,0C10H,0C10H,0C12H,0C12H,0C14H,0C14H,0C16H  ; A ROW
  127.         DW    0C16H,0C18H,0C18H,0C1AH,0C1AH,0C1CH,0C1CH,0C1EH,0C1EH  ; 
  128.         DW    0C22H,0C22H,0C24H,0C26H,0C26H                          ; 
  129.  
  130.         DW    0F00H,0F02H,0F11H,0F07H,0F07H,0F09H,0F09H,0F0BH,0F0BH  ;
  131.         DW    0F0DH,0F0DH,0F0FH,0F0FH,0F11H,0F11H,0F13H,0F13H,0F15H  ; Z ROW
  132.         DW    0F15H,0F17H,0F17H,0F19H,0F19H,0F1BH,0F1BH,0F1DH,0F1FH  ; 
  133.         DW    0F22H,0F22H,0F24H,0F24H,0F26H,0F26H,0F27H              ;      
  134.  
  135.         DW    1200H,1202H,1209H,120DH,121BH,121FH,121FH,1225H,1225H           ;BOTTOM ROW
  136.  
  137.  
  138. ;This table is to fill the bottom section of the function keys & shift keys
  139. ;               0 = no extra fill
  140.  
  141. key_location2    DW    0700H,0702H,28 DUP(0),0A00H,0A02H,0A04H,0A04H,32 DUP(0)
  142.         DW    0D00H,0D02H,30 DUP(0),1000H,1002H,1011H,22 DUP(0),101DH
  143.         DW    8 DUP(0),1300H,1302H,7 DUP(0)
  144.  
  145. ;fill_length --> number of blocks to fill
  146.  
  147. fill_length    DW    1,1,3,24 DUP (1),2,2,2,1,1,2,2,24 DUP(1),2,9 DUP(1),3
  148.         DW    65 DUP(1),3,11,2,3,3,3,3
  149.  
  150.         PAGE
  151. ;=============================================================================
  152. ;
  153. ; Stat_masks ---->      7    6    5    4    3    2    1    0
  154. ;             |    |    |    |    |    |    |    |
  155. ;            |    |    |    |    |    |    |     ---Right shift
  156. ;            |    |    |    |    |    |     --------Left shift
  157. ;            |    |    |    |    |     -------------Control
  158. ;            |    |    |    |     ------------------Alternate
  159. ;            |    |    |     -----------------------Scroll lock
  160. ;            |    |     ----------------------------Num lock
  161. ;            |     ---------------------------------Caps lock
  162. ;             --------------------------------------Insert mode        
  163. ;
  164. ;  0 = off
  165. ;  1 = on or depressed
  166. ;
  167. ;=============================================================================
  168.  
  169. stat_masks    DW    8080H,4040H,2020H,1010H,0808H,0404H,0202H,0101H
  170.  
  171. ;Status key screen locations
  172. ;                        INS   CL    NL    SL    ALT   CTL  Sft L Sft R
  173. stat_key_loc    DW    121FH,121BH,0623H,0626H,1206H,0C04H,0F05H,0F1DH
  174.  
  175. stat_key_loc2    DW     6 DUP(0),1005H,101DH
  176.  
  177. stat_key_len    DW    3,2,2,2,3,3,1,1
  178.  
  179.         PAGE
  180.  
  181.  
  182. ;----------------------------------   Messages   ------------------------------
  183.  
  184.  
  185. ;            |             width = 40              |        
  186. overlaymsg    DB    '              KEYBOARD TEST  ',cr,lf,lf,lf,lf,lf
  187.         DB    'F F ESC 1 2 3 4 5 6 7 8 9 0 - = BS NL SL ',cr
  188.         DB      '1 2',cr,lf,lf            
  189.     
  190.         DB    'F F <- Q W E R T Y U I O P [ ] <- 7 8 9-',cr
  191.         DB    '3 4 ->', cr,lf,lf            
  192.         
  193.         DB    "F F CTL A S D F G H J K L ; ' `   4 5 6 ",cr
  194.         DB    '5 6',cr,lf,lf
  195.  
  196.         DB    'F F  S \ Z X C V B N M , . ? S *  1 2 3+',cr
  197.         DB    '7 8  L                       R ',cr,lf,lf
  198.  
  199.         DB    'F F   ALT       space      CL  INS   DEL',cr
  200.         DB    '9 0',cr,lf,lf,eos
  201.  
  202.  
  203. key_error_msg    DB    '   KEY ERROR or undefined key ',eos
  204.  
  205. blank_msg    DB    '                              ',eos
  206.  
  207. data        ENDS
  208.         SUBTTL    code section
  209.         PAGE
  210. code        SEGMENT PUBLIC 'code'
  211.  
  212.         ASSUME cs:code, ds:data, ss:stack
  213.  
  214.         cli
  215.         mov    ax, SEG stack
  216.         mov    ss, ax
  217.         mov    sp, OFFSET top_of_stack
  218.         sti
  219.         xor    ax, ax
  220.         pushf
  221.         push    ds
  222.         push    ax        
  223.         mov    ax, SEG data
  224.         mov    ds, ax 
  225.         mov    es, ax
  226.         mov    video_attribute, blinking    
  227.         mov    current_page, 0
  228.         mov    current_mode, 0
  229.         mov    scroll_count, 0
  230.         mov    start_of_scroll, 0
  231.         mov    end_of_scroll, 184FH
  232.         call    set_new_mode
  233.         mov    cursor_start, 20    ;remove cursor
  234.         call    cursor    
  235.         call    blank_window
  236.         mov    dx, 0100H
  237.         call    mov_cursor
  238.         mov    att_length, 80
  239.         mov    video_attribute, brite
  240.         call    set_attribute        ;set for brite title
  241.         mov    dx, OFFSET overlaymsg
  242.         call    printstring
  243.         mov    dx, 1600H
  244.         call    mov_cursor
  245.         mov    att_length, 40
  246.         call    set_attribute        ;set for brite ERROR msg
  247. keyboard_check_restart:
  248.         call    keyboard_check        
  249.         jmp    keyboard_check_restart
  250.         iret                ;I don't know why!!!
  251.  
  252.  
  253.         PAGE
  254. keyboard_check:
  255.         mov    ah, shift_status
  256.         int    keybdIO            ;get current status settings
  257.         mov    shift_stat_reg,al    ;store it
  258. keycheck:
  259.  
  260.         cld                ;forward march!
  261.         mov    ah, shift_status
  262.         int    keybdIO            ;check status keys
  263.         cmp    shift_stat_reg, al
  264.         je    no_shift
  265.         call    shift_stat_check
  266.         jmp    keyboard_check
  267. no_shift:    
  268.         call    constatus
  269.         jz    keycheck
  270.  
  271.         mov    dx, 1604H
  272.         call    mov_cursor
  273.         mov    dx, OFFSET blank_msg
  274.         call    printstring          ;erase error message
  275.  
  276.         call    conin            ;returns scancode in AH
  277.         mov    cx, keytable_length    ;& character code in AL
  278.         mov    di, OFFSET keytable
  279. key_loop:
  280.         scasw                ;compare AX with [DI]
  281.         jz    found_key
  282.         loop    key_loop
  283.  
  284.         mov    dx, 1604H
  285.         call    mov_cursor
  286.         mov    dx, OFFSET key_error_msg
  287.         call    printstring
  288.         jmp    keyerror
  289. found_key:    
  290.         mov    bx, keytable_length
  291.         sub    bx, cx            ;how many scasw did we do?        
  292.         shl    bx, 1            ;BX = BX * 2 (for word op's)
  293.         mov    di, bx
  294.         push    di
  295.         mov    dx, OFFSET key_location 
  296.         add    di, dx
  297.         mov     bx, [di]
  298.         mov    key_loc, bx        ;get location on screen
  299.         pop    di
  300.         push    di
  301.         mov    dx, OFFSET key_location2
  302.         add    di, dx
  303.         mov    bx, [di]
  304.         mov    key_loc2, bx
  305.         pop    di
  306.  
  307.         mov    dx, OFFSET fill_length
  308.         add    di, dx
  309.         mov    bx, [di]
  310.         mov    att_length, bx        ;get width to light
  311.  
  312.         mov    dx, key_loc        
  313.         call    mov_cursor
  314.         mov    video_attribute, inversnormal
  315.         call    set_attribute
  316.         mov    dx, key_loc2
  317.         cmp    dx, 0            ;should we fill?
  318.         je    recheck
  319.         call    mov_cursor
  320.         call    set_attribute
  321. recheck:
  322.         jmp    keycheck
  323.  
  324. keyerror:
  325.         mov    dx, 1700H
  326.         call    mov_cursor
  327.         ret    
  328.  
  329.         PAGE
  330. ;Enters with current status byte in AL
  331.  
  332. shift_stat_check:
  333.         mov    ah, shift_stat_reg
  334.         mov    bx, ax            ;save old & new stat registers
  335.         mov    di, 0            ;reset pointer
  336.         mov    si, OFFSET stat_masks
  337.         mov    cx, 8            ;look at 8 bits
  338. stat_loop:
  339.         mov    ax, bx            ;restore old & new stat register
  340. ;AL = latest status register
  341. ;AH = previous status register
  342.         mov    dx, [si]        ;get mask
  343.         and    ax, dx            ;mask
  344.         cmp    ah, al            ;has this bit changed?
  345.         jne    found_stat
  346.         inc    di
  347.         inc    di
  348.         inc    si
  349.         inc    si
  350.         loop    stat_loop
  351.         jmp    stat_ret
  352. found_stat:
  353.         mov    dx, OFFSET stat_key_len
  354.         push    di
  355.         add    di, dx
  356.         mov    bx, [di]
  357.         mov    att_length, bx
  358.         pop    di
  359.         mov    dx, OFFSET stat_key_loc    
  360.         push    di
  361.         add    di, dx
  362.         mov    dx, [di]
  363.         call    mov_cursor
  364.         call    set_attribute
  365.         pop    di
  366.         mov    dx, OFFSET stat_key_loc2
  367.         add    di, dx
  368.         mov    dx, [di]
  369.         cmp    dx, 0            ;should we fill again?
  370.         jz    stat_ret
  371.         call    mov_cursor
  372.         call    set_attribute
  373. stat_ret:
  374.         ret
  375.  
  376.  
  377.         PAGE
  378. ;--------------- console IO subroutines -----------------
  379. conout:
  380.         push    ax
  381.         push    bx
  382.         push    bp
  383.         mov    ah, chr_out
  384.         mov    bh, current_page
  385.         mov    bl, 0
  386.         int    videoIO
  387.         pop    bp
  388.         pop    bx
  389.         pop    ax
  390.         ret
  391.  
  392. conin:
  393.         xor    ah, ah
  394.         int    keybdIO
  395.         ret
  396.  
  397. constatus:
  398.         push    ax
  399.         mov    ah, key_status
  400.         int    keybdIO
  401.         pop    ax
  402.         ret
  403.  
  404.         PAGE
  405. set_new_mode:
  406.         mov    al, current_mode
  407.         xor    ah, ah
  408.         int    videoIO
  409.         ret
  410.  
  411. set_attribute:
  412.         push    ax
  413.         push    bx
  414.         push    cx
  415.         push    dx            ;save current cursor position
  416.         mov    cx, att_length
  417. att_loop:
  418.         push    cx
  419.         mov    bh, current_page
  420.         mov    ah, chr_att_in        ;get character at cursor
  421.         int    videoIO
  422.  
  423.         mov    bh, current_page
  424.         mov    ah, chr_att_out        ;write old char & new attribute
  425.         mov    bl, video_attribute
  426.         mov    cx, 1
  427.         int    videoIO
  428.         inc    dx
  429.         call    mov_cursor
  430.         pop    cx
  431.         loop    att_loop
  432.  
  433.         pop    dx
  434.         call    mov_cursor        ;move cursor to original position
  435.         pop    cx
  436.         pop    bx
  437.         pop    ax
  438.         ret
  439.  
  440.  
  441. mov_cursor:
  442.         push    ax
  443.         push    bx
  444.         mov    ah, pos_cursor
  445.         mov    bl, current_page
  446.         xor    bh, bh
  447.         int    videoIO
  448.         pop    bx
  449.         pop    ax
  450.         ret
  451.  
  452. blank_screen:                ;cx = row col start of blank
  453.         mov    ah, scroll_up
  454.         mov    al, 0
  455.         mov    bh, video_attribute
  456.         mov    dx, 1950H
  457.         int    videoIO
  458.         ret
  459.         PAGE
  460. blank_window:
  461.         push    ax
  462.         mov    ah, scroll_up
  463.         mov    al, 0
  464.         push    bx    
  465.         push    cx
  466.         push    dx
  467.         mov    cx, start_of_scroll
  468.         mov    dx, end_of_scroll
  469.         mov    bh, video_attribute
  470.         int    videoIO
  471.         pop    dx
  472.         pop    cx
  473.         pop    bx
  474.         pop    ax
  475.         ret
  476.  
  477. printstring:
  478.         push    ax
  479.         push    bx
  480. printloop:
  481.         mov    bx, dx
  482.         mov    al, [bx]
  483.         cmp    al, eos
  484.         je    string_ret
  485.         call    conout
  486.         inc    dx
  487.         jmp    printloop
  488. string_ret:
  489.         pop    bx
  490.         pop    ax
  491.         ret
  492. cursor:
  493.         mov    dx, 3D4H        ;address register
  494.         mov    al, 10            ;cursor start register
  495.         out    dx, al            ;select cursor start
  496.  
  497.         mov    dx,3D5H            ;address data registers
  498.         mov    al, cursor_start    ;get "on" or "off" value
  499.         out    dx, al            ;cursor is now altered
  500.         ret 
  501.  
  502.  
  503.  
  504. code        ENDS        
  505.         END
  506.